package cn.dckeji.dcssm.common.utils;

import cn.hutool.setting.dialect.Props;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * @author kenny
 * @Title: CodeGenerator
 * @ProjectName dcssm
 * @Description: TODO
 * @date 2019/2/21 13:59
 */
public class CodeGenerator {

    //====================================================================================
    //根据自己的项目需求更改以下配置信息

    //设置到本地的目录
    public static String outPutDir = "C:\\dcssm";
    //设置包路径
    public static String baseParent = "cn.dckeji.dcssm";
    //设置排除表前缀, 把自己的业务表前缀,增加到下面的数组中,生成的类名就不会带表前缀
    public static String[] tablePrefix = {"system_"};
    //设置是否本地测试库，0线上，1本地
    public static Integer isDev = 1;
    //设置是否包含逻辑删除 0不包含，1包含  文档地址：https://mp.baomidou.com/guide/logic-delete.html
    public static Integer isLogic = 1;
    //设置逻辑删除的字段名
    public static String logicFiled = "is_deleted";
    //设置是否生成全部表 0不生成所有表, 1生成所有表
    public static Integer isMakeAllTable = 1;
    //设置需要生成的表名, isMakeAllTable = 0 时有效
    public static String[] needMakeTable = {};
    //设置需要排除生成的表名
    public static String[] notNeedMakeTable = {};
    //====================================================================================

    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(outPutDir);
        gc.setFileOverride(true);
        gc.setActiveRecord(true);
        gc.setEnableCache(false);
        gc.setBaseResultMap(false);
        gc.setBaseColumnList(false);
        //设置id的生成策略,这里修改生成策略,记得在spring-dao里配置的生成策略也要修改
        gc.setIdType(IdType.UUID);
        //实体类开启swagger2注解
        gc.setSwagger2(true);
        gc.setAuthor("Kenny");

        // 自定义文件命名，注意 %s 会自动填充表实体属性！
        gc.setMapperName("%sDao");
         gc.setXmlName("%sMapper");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
         gc.setControllerName("%sController");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        Props props = null;
        if (isDev == 1) {
            props = new Props("jdbc-dev.properties", "utf-8");
        }else {
            props = new Props("jdbc.properties", "utf-8");
        }
        String username = props.getStr("spring.datasource.username");
        String password = props.getStr("spring.datasource.password");
        String url = props.getStr("spring.datasource.url");
        String driver = props.getStr("spring.datasource.driverClassName");
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setDriverName(driver);
        dsc.setUsername(username);
        dsc.setPassword(password);
        dsc.setUrl(url);
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 此处可以修改为您的表前缀
        strategy.setTablePrefix(tablePrefix);
        // 表名生成策略驼峰
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 需要生成的表 允许正则
        if (isMakeAllTable == 0) {
            strategy.setInclude(needMakeTable);
        }
        // 排除生成的表 允许正则
        strategy.setExclude(notNeedMakeTable);
        // 字段名生成策略
//        strategy.setFieldNaming(NamingStrategy.underline_to_camel);
        //字段前缀,生成的pojo中去除属性的is
        strategy.setFieldPrefix(new String[]{"is_"});
        //生成 @RestController 控制器
        strategy.setRestControllerStyle(true);
        //逻辑删除属性名称
        if (isLogic == 1) {
            strategy.setLogicDeleteFieldName(logicFiled);
        }
        strategy.setEntityTableFieldAnnotationEnable(true);

        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(baseParent);
        //pc.setModuleName("admin");
        pc.setController("controller");
        pc.setMapper("dao");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setXml("mapper");

        mpg.setPackageInfo(pc);
        mpg.execute();
    }
}
